package com.apps.saspect.utils;

import com.apps.saspect.model.vo.KeyValueVo;
import com.apps.sexctption.DataException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.annotation.Annotation;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * 切面工具类
 */
@Slf4j
public class AspectUtils {


    /**
     * 解析出所有方法传参被@JoinKey注解了的参数名
     * @param point
     * @return
     */
    public static List<KeyValueVo> handlerParameter(JoinPoint point,Class<? extends Annotation> annotation){
        List<KeyValueVo> result=new ArrayList<>();
        MethodSignature methodSignature = (MethodSignature)point.getSignature();
        Parameter[] parameter=methodSignature.getMethod().getParameters();
        Object[] args = point.getArgs();
        for(int i=0;i<parameter.length;i++)
        {
            String parameterName=methodSignature.getParameterNames()[i];
            if(null != parameter[i].getAnnotation(annotation))
                result.add(new KeyValueVo(parameterName,args[i]));
        }
        return result;
    }

    /**
     * 解析模型里面的参数,将被@JoinKey注解的字段拼接成key,如果没有@JoinKey则默认用@TableId的字段做key
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
//    @SneakyThrows
//    public static String handlerModelJoinKey(Object obj)  {
//        if(null==obj)
//            throw new RuntimeException("传入模型为空");
//        Field[] fields = obj.getClass().getDeclaredFields();
//        String result="";
//        for (Field item : fields) {
//            item.setAccessible(true);
//            Object object=item.get(obj);
//            JoinKey joinKey=item.getAnnotation(JoinKey.class);
//            if(null != joinKey && null == item.getAnnotation(TableId.class) && null != object)
//            {
//                if(!object.getClass().isAssignableFrom(Integer.class) &&
//                        !object.getClass().isAssignableFrom(String.class) &&
//                        !object.getClass().isAssignableFrom(Float.class) &&
//                        !object.getClass().isAssignableFrom(Double.class) &&
//                        !object.getClass().isAssignableFrom(Enum.class))
//                    throw new DataException("不受支持的参数类型");
//                result +="&"+object.toString();
//            }
//            TableId tableId=item.getAnnotation(TableId.class);
//            if(null!=tableId && null != object)
//            {
//                result +="&"+object.toString();
//            }
//
//        }
//
//        return result;
//    }

    /**
     * 生成key
     * @param keyValueVos
     * @return
     */
    public static String generateKey(List<KeyValueVo> keyValueVos) {
        String result = "";
        //用参数名+参数的值拼接出key
        for (int i = 0; i < keyValueVos.size(); i++) {
            if (keyValueVos.get(i).getValue().getClass().isAssignableFrom(Integer.class) ||
                    keyValueVos.get(i).getValue().getClass().isAssignableFrom(String.class) ||
                    keyValueVos.get(i).getValue().getClass().isAssignableFrom(Float.class) ||
                    keyValueVos.get(i).getValue().getClass().isAssignableFrom(Double.class) ||
                    keyValueVos.get(i).getValue().getClass().isAssignableFrom(Enum.class)) {
                result += keyValueVos.get(i).getKey() + ":" + keyValueVos.get(i).getValue().toString() + "_";
            } else
                throw new DataException("只支持String,Integer,Float,Double,Enum类型做key");
        }
        return result;
    }
}
